#pragma once

#define ONLY_ONE_INSTANCE(class_name) \
protected: \
	class_name() {} \
	class_name(const class_name&) {} \
public: \
	static class_name* Instance(void) \
	{ \
		static class_name instance; \
		return &instance; \
	}


template<class entity_type>
class State
{
protected:
	State() {}
	State(const State&) {}

public:
	virtual ~State(void) { };

	virtual void Enter(entity_type*) = 0;

	virtual void Execute(entity_type*) = 0;

	virtual void Exit(entity_type*) = 0;
};
